﻿/*
*************************************************************************
**                                                                      *
** ZERING TEST SCRIPT                                                   *
**                                                                      *
** 实时搜索引擎示例程序                                                 *
**                                                                      *
*************************************************************************
**                                                                      *
** 演示如何调用实时搜索引擎，执行基本功能                               *
**                                                                      *
*************************************************************************
*/
/* =================================================================== */
/*|                            辅助函数                               |*/
/* =================================================================== */
/***********************************************************************/
/*  Function Name : RT_Search                                         */
/*---------------------------------------------------------------------*/
/*  FUNCTION : 搜索                                                    */
/*  INPUT    : p_Sid     : 会话字符串                                  */
/*             p_SString : 搜索字符串                                  */
/*             p_uPageNo : 页号                                        */
/*  OTHERS   :                                                         */
/***********************************************************************/
function RT_Search( p_Sid, p_SString, p_uPageNo ) 
{
    /*
    *********************************************************************
    ** 首先对查询字符串进行正规化处理                                   *
    *********************************************************************
    */
	l_NormalString = API_RpcCall( "LEXER.NORMALIZE", p_SString );	
    /*
    *********************************************************************
    ** 然后调用 SMART CACHE 进行查询                                    *
    *********************************************************************
    */
	if( l_NormalString.length > 0 ) {
		l_aResult = API_RpcCall
			( "SCACHE.SIMPLEQUERY", 
			   p_Sid,
			   l_NormalString,
			   p_uPageNo,
			   25,
			   "RT.OUT" );

		if( 1 == l_aResult[0] ) 
		{
			OBJ_ARRAY = MDB_TableQuery( "CONN_TABLE", "SID like %0", p_Sid );

			l_Msg          = new Object;
			l_Msg.tag      = "mnra_search_result";
			l_Msg.result   = l_aResult[1];

			l_Text =  JSON.stringify(l_Msg);

			API_LocalRpcSend
				( "HCTR.WS.TEXT.SEND",
				  OBJ_ARRAY[0].ConnId,
				  l_Text );
		} 
		else if( 2 == l_aResult[0] ) 
		{
			API_Trace("无搜索结果");
		} 
		else 
		{
			API_Trace("产生错误");
		}
	}
}
/***********************************************************************/
/*  Function Name : RT_Post                                            */
/*---------------------------------------------------------------------*/
/*  FUNCTION : 张贴                                                    */
/*  INPUT    : p_SourceId : 标识字符串                                 */
/*             p_Text     : 文本字符串                                 */
/*  OTHERS   :                                                         */
/***********************************************************************/
function RT_Post( p_SourceId, p_Text ) 
{
    /*
    *********************************************************************
    ** 对输入字符串进行分词                                             *
    *********************************************************************
    */
	l_LexedText = API_RpcCall( "LEXER.LEX", p_Text );	
    /*
    *********************************************************************
    ** 向 Minerva 输出                                                  *
    *********************************************************************
    */
	if( l_LexedText.length > 0 ) {
		API_RpcSend( "MNRA.INPUT", p_SourceId, l_LexedText );
	}
}
/* =================================================================== */
/*|                           初始化函数                              |*/
/* =================================================================== */
/***********************************************************************/
/*  Function Name : TabInit                                            */
/*---------------------------------------------------------------------*/
/*  FUNCTION : 在内存数据库中建立连接控制表                            */
/*  OTHERS   :                                                         */
/***********************************************************************/
function TabInit() 
{
    /*
    *********************************************************************
    ** 生成连接状态的 "模板对象"                                        *
    *********************************************************************
    */
    CONN_TYPE        = new Object;
    CONN_TYPE.State  = "FREE";
    CONN_TYPE.SID    = "1234567_0";
    CONN_TYPE.ConnId = 12345;
    /*
    *********************************************************************
    ** 将“模板对象”转换为内存数据库的内部类型                         *
    *********************************************************************
    */
    MDB_LoadType( CONN_TYPE, "CONN_TYPE" );
    /*
    *********************************************************************
    ** 根据这个内部类型在内存数据库中建表                               *
    *********************************************************************
    */
    if( "OK" == MDB_TableNew( "CONN_TABLE", "CONN_TYPE", "SID" )) {
        API_Trace("连接状态表建立成功");
    } else {
        API_Trace("连接状态表建立失败");
    }
}
/***********************************************************************/
/*  Function Name : OnInit                                             */
/*---------------------------------------------------------------------*/
/*  FUNCTION : 初始化函数                                              */
/*  OTHERS   :                                                         */
/***********************************************************************/
function OnInit() 
{
    /*
    *********************************************************************
    ** 初始化内存数据库中的数据表                                       *
    *********************************************************************
    */
    if( 0 == API_GetFlag(0)) {
        TabInit();
        API_SetFlag(0, 1);
    }
    /*
    *********************************************************************
    ** 加载库函数                                                       *
    *********************************************************************
    */
    API_LoadJs("Lib.js");
    /*
    *********************************************************************
    ** 设置 RPC 函数                                                    *
    *********************************************************************
    */
    API_SetRpcHandler("RT.OUT", RPC_StreamOut );

	API_SetRpcHandler("WS_JOIN:/RTSearcher", RPC_Join);
    API_SetRpcHandler("WS_LEAV:/RTSearcher", RPC_Leave);
    API_SetRpcHandler("WS_DATA:/RTSearcher", RPC_Data);

    API_Trace("RTSearcher 启动完毕");
}
/* =================================================================== */
/*|                            退出函数                               |*/
/* =================================================================== */
/***********************************************************************/
/*  Function Name : OnExit                                             */
/*---------------------------------------------------------------------*/
/*  FUNCTION : 退出函数                                                */
/*  OTHERS   :                                                         */
/***********************************************************************/
function OnExit() 
{
	API_Trace("RTSearcher 退出完毕");
}
/* =================================================================== */
/*|                            RPC 函数                               |*/
/* =================================================================== */
/***********************************************************************/
/*  Function Name : RPC_StreamOut                                      */
/*---------------------------------------------------------------------*/
/*  FUNCTION : 实时搜索结果转发                                        */
/*  INPUT    : p_Sid      : 会话字符串                                 */
/*             p_SString  : 搜索字符串                                 */
/*             p_Time     : 时间标签                                   */
/*             p_fScore   : 评分                                       */
/*             p_Result   : 经过标注的结果                             */
/*             p_SourceId : 源 ID                                      */
/*  OTHERS   :                                                         */
/***********************************************************************/
function RPC_StreamOut( p_Sid, 
	                    p_SString, 
						p_Time,
						p_fScore,
						p_Result,
						p_SourceId ) 
{
	OBJ_ARRAY = MDB_TableQuery( "CONN_TABLE", "SID like %0", p_Sid );

	l_Msg          = new Object;
	l_Msg.sstring  = p_SString;
	l_Msg.tag      = "mnra_stream_out";
	l_Msg.time     = p_Time;
    l_Msg.score    = p_fScore ;
    l_Msg.result   = p_Result;
    l_Msg.sourceid = p_SourceId;
    l_Msg.seq      = 0;
    l_Msg.page_no  = 0;
 
	l_Text =  JSON.stringify(l_Msg);

    API_LocalRpcSend
    ( "HCTR.WS.TEXT.SEND",
      OBJ_ARRAY[0].ConnId,
      l_Text );

}
/***********************************************************************/
/*  Function Name : RPC_Join                                           */
/*---------------------------------------------------------------------*/
/*  FUNCTION : 连接事件处理                                            */
/*  INPUT    : p_uConnNo : 连接号                                      */
/*  OTHERS   :                                                         */
/***********************************************************************/
function RPC_Join( p_uConnNo ) 
{
    /*
    *********************************************************************
    ** 打印来自 HCTR 的连接号                                           *
    *********************************************************************
    */
    API_Trace(sprintf("HCTR 的 %d 号连接建立", p_uConnNo));
    /*
    *********************************************************************
    ** 生成 SID                                                         *
    *********************************************************************
    */
    var l_List = new Array(API_GetLocalModuleNo().toString(),API_Time32().toString(),p_uConnNo.toString());
    var l_Sid = l_List.join("_");
    /*
    *********************************************************************
    ** 将连接对象插入数据表                                             *
    *********************************************************************
    */
    CONN_OBJ         = new Object;
    CONN_OBJ.State   = "CONN";
    CONN_OBJ.SID     = l_Sid;
    CONN_OBJ.ConnId  = p_uConnNo;

    API_Trace(sprintf("连接对象为：%s", JSON.stringify(CONN_OBJ)));
    API_Trace(sprintf("将连接对象插入数据表 -- %s", MDB_TableInsert("CONN_TABLE", CONN_OBJ)));
    /*
    *********************************************************************
    ** 返回 SID                                                         *
    *********************************************************************
    */
    return l_Sid;
}
/***********************************************************************/
/*  Function Name : RPC_Leave                                          */
/*---------------------------------------------------------------------*/
/*  FUNCTION : 关闭事件处理                                            */
/*  INPUT    : p_Sid  : 会话字符串                                     */
/*  OTHERS   :                                                         */
/***********************************************************************/
function RPC_Leave( p_Sid ) 
{

    API_Trace( sprintf("%s 已经关闭连接，从数据表中删除 -- %s", p_Sid, 
		MDB_TableRemove("CONN_TABLE", "SID like %0", p_Sid ) ) );
}
/***********************************************************************/
/*  Function Name : RPC_Data                                           */
/*---------------------------------------------------------------------*/
/*  FUNCTION : 来自客户端的数据处理                                    */
/*  INPUT    : p_Sid  : 会话字符串                                     */
/*             p_Text ：来自客户端的数据                               */
/*  OTHERS   :                                                         */
/***********************************************************************/
function RPC_Data( p_Sid, p_Text ) 
{
    OBJ_ARRAY = MDB_TableQuery( "CONN_TABLE", "SID like %0", p_Sid );

	Input = JSON.parse( p_Text );

	switch( Input.command )
	{
	case "search":
		{
			RT_Search( p_Sid, Input.ss, Input.pageno );
			break;
		}
	case "post":
		{
			RT_Post( p_Sid, Input.text );
			break;
		}    
	}
}
/*
*************************************************************************
**                                                                      *
** ZERING TEST SCRIPT                                                   *
**                                                                      *
** 实时搜索引擎示例程序                                                 *
**                                                                      *
*************************************************************************
**                                                                      *
** 演示如何调用实时搜索引擎，执行基本功能                               *
**                                                                      *
*************************************************************************
*/